home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 43 / Mac Magazin and MacEasy Magazine CD - Issue 43.iso / Software / Multimedia / Sound / PlayerPRO 4.6 Dev.Kit / MADH Library 4.6 / MADLibrary Source / OutPut16.c < prev    next >
Encoding:
Text File  |  1998-01-23  |  14.4 KB  |  574 lines  |  [TEXT/CWIE]

  1. /********************                        ***********************/
  2. //
  3. //    Player PRO 4.6 - DRIVER SOURCE CODE -
  4. //
  5. //    Library Version 4.6
  6. //
  7. //    To use with MAD Library for Mac: Symantec, CodeWarrior and MPW
  8. //
  9. //    Antoine ROSSET
  10. //    16 Tranchees
  11. //    1206 GENEVA
  12. //    SWITZERLAND
  13. //
  14. //    COPYRIGHT ANTOINE ROSSET 1996, 1997, 1998
  15. //
  16. //    Thank you for your interest in PlayerPRO !
  17. //
  18. //    FAX:            (+41 22) 346 11 97
  19. //    PHONE:             (+41 79) 203 74 62
  20. //    Internet:         rosset@dial.eunet.ch or RossetAntoine@bluewin.ch
  21. //
  22. /********************                        ***********************/
  23.  
  24. #include "RDriver.h"
  25. #include "RDriverInt.h"
  26.  
  27. #define TICKREMOVESIZE2    500L
  28.  
  29. void Sampler16Add( Channel *curVoice, register short    *ASCBuffer, MADDriverRec* intDriver)
  30. {
  31.     Ptr                    SndBuffer;
  32.     Byte                tByte;
  33.     short                *VolPtr, i = intDriver->ASCBUFFER;
  34.     
  35.     ///
  36.     long                off, aDD, aCC = curVoice->lAC;
  37.     
  38.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  39.     ///
  40.  
  41.     if( curVoice->prevPtr != curVoice->begPtr)
  42.     {
  43.         if( curVoice->lastWord != 0)
  44.         {
  45.             curVoice->curLevel        = TICKREMOVESIZE2;
  46.             curVoice->curLastWord    = curVoice->lastWord;
  47.             curVoice->lastWord        = 0;
  48.             
  49.             curVoice->prevPtr        = curVoice->begPtr;
  50.         }
  51.     }
  52.         
  53.     if( curVoice->curLevel > 0)
  54.     {
  55.         short    *ASCBufferCopy = ASCBuffer;
  56.         
  57.         while( i-- > 0)
  58.         {
  59.             *(ASCBuffer) += (curVoice->curLastWord * curVoice->curLevel) / TICKREMOVESIZE2;
  60.             if( curVoice->curLevel > 0) curVoice->curLevel--;
  61.             ASCBuffer += 2;
  62.         }
  63.         
  64.         i = intDriver->ASCBUFFER;
  65.         ASCBuffer = ASCBufferCopy;
  66.     }
  67.     
  68.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  69.  
  70.     SndBuffer        = curVoice->curPtr;
  71.     VolPtr            = (short*) ( intDriver->Vol + (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) <<8)*2L);
  72.     
  73.     if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
  74.     {
  75.         if( intDriver->DriverSettings.Interpolation)
  76.         {
  77.             long    RightWeight, LeftWeight;
  78.         
  79.             while( i-- > 0)
  80.             {
  81.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  82.                 
  83.                 off = (aCC>>BYTEDIV);
  84.                 if( SndBuffer + off + 1 >= curVoice->maxPtr)
  85.                 {
  86.                     if( curVoice->loopSize > 0)
  87.                     {
  88.                         SndBuffer -= curVoice->loopSize;
  89.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  90.                     }
  91.                     else    // If TICK remove
  92.                     {
  93.                         aCC -= aDD;
  94.                         curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
  95.                         aCC += aDD;
  96.                         
  97.                         i++;
  98.                         while( i-- > 0)
  99.                         {
  100.                             *(ASCBuffer) += curVoice->lastWord;
  101.                             ASCBuffer += 2;
  102.                         }
  103.                         
  104.                         curVoice->prevPtr = 0L;
  105.                         
  106.                         break;
  107.                     }
  108.                 }
  109.                 
  110.                 tByte = ((         LeftWeight **(SndBuffer + off)
  111.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  112.                 
  113.                 *(ASCBuffer) += *(VolPtr + tByte );     aCC += aDD;
  114.                 ASCBuffer += 2;
  115.             }
  116.             
  117.             curVoice->lastWord = *(VolPtr + tByte);
  118.         }
  119.         else
  120.         {
  121.             while( i-- > 0)
  122.             {
  123.                 off = (aCC>>BYTEDIV);
  124.                 if( SndBuffer + off + 1 >= curVoice->maxPtr)
  125.                 {
  126.                     if( curVoice->loopSize > 0) 
  127.                     {
  128.                         SndBuffer -= curVoice->loopSize;
  129.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  130.                     }
  131.                     else    // If TICK remove
  132.                     {
  133.                         aCC -= aDD;
  134.                         curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
  135.                         aCC += aDD;
  136.                         
  137.                         i++;
  138.                         while( i-- > 0)
  139.                         {
  140.                             *(ASCBuffer) += curVoice->lastWord;
  141.                             ASCBuffer += 2;
  142.                         }
  143.                         break;
  144.                     }
  145.                 }
  146.                 *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + off)));     aCC += aDD;
  147.                 ASCBuffer += 2;
  148.             }
  149.             
  150.             /**/
  151.             aCC -= aDD;
  152.             curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
  153.             aCC += aDD;
  154.             /**/
  155.         }
  156.         
  157.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  158.         else
  159.         {
  160.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  161.         }
  162.     }
  163.     else
  164.     {
  165.         if( intDriver->DriverSettings.Interpolation)
  166.         {
  167.             long    RightWeight, LeftWeight;
  168.             
  169.             while( i-- > 0)
  170.             {
  171.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  172.                 
  173.                 off = (aCC>>BYTEDIV);
  174.                 tByte = ((         LeftWeight **(SndBuffer + off)
  175.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  176.                 
  177.                 *(ASCBuffer) += *(VolPtr + tByte);     aCC += aDD;
  178.                 ASCBuffer += 2;
  179.             }
  180.             
  181.             /**/
  182.             curVoice->lastWord = *(VolPtr + tByte);
  183.             /**/
  184.         }
  185.         else
  186.         {
  187.             while( i-- > 0)
  188.             {
  189.                 off = (aCC>>BYTEDIV);
  190.                 *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));     aCC += aDD;
  191.                 ASCBuffer += 2;
  192.             }
  193.             
  194.             /**/
  195.             aCC -= aDD;
  196.             curVoice->lastWord = *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));
  197.             aCC += aDD;
  198.             /**/
  199.         }
  200.         
  201.         curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  202.     }
  203.     
  204.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  205. }
  206.  
  207. void Sampler16Addin16( Channel *curVoice, register short    *ASCBuffer, MADDriverRec* intDriver)
  208. {
  209.     short                i = intDriver->ASCBUFFER, vol, tByte;
  210.     short                *SndBuffer;
  211.     long                chnVol;
  212.     
  213.     ///
  214.     long                off, aDD, aCC = curVoice->lAC;
  215.     
  216.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  217.     ///
  218.  
  219.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  220.     
  221.     SndBuffer        = (short*)    curVoice->curPtr;
  222.     vol                = (short)    64 * intDriver->trackDiv;    // * 2;    //intDriver->trackDiv;
  223.     chnVol            = ((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64);
  224.  
  225.     if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= ( short*) curVoice->maxPtr)
  226.     {
  227.         if( intDriver->DriverSettings.Interpolation)
  228.         {
  229.             long    RightWeight, LeftWeight;
  230.         
  231.             while( i-- > 0)
  232.             {
  233.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  234.                 
  235.                 off = (aCC>>BYTEDIV);
  236.                 if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
  237.                 {
  238.                     if( curVoice->loopSize > 0) 
  239.                     {
  240.                         SndBuffer -= curVoice->loopSize/2;
  241.                         if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
  242.                     }
  243.                     else break;
  244.                 }
  245.                 
  246.                 tByte = ((         LeftWeight **(SndBuffer + off)
  247.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  248.                 
  249.                 *ASCBuffer += (tByte * chnVol) / vol;     aCC += aDD;
  250.                 ASCBuffer += 2;
  251.             }
  252.         }
  253.         else
  254.         {
  255.             while( i-- > 0)
  256.             {
  257.                 off = (aCC>>BYTEDIV);
  258.                 if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
  259.                 {
  260.                     if( curVoice->loopSize > 0) 
  261.                     {
  262.                         SndBuffer -= curVoice->loopSize;
  263.                         if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
  264.                     }
  265.                     else break;
  266.                 }
  267.                 *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol;     aCC += aDD;
  268.                 ASCBuffer += 2;
  269.             }
  270.         }
  271.         
  272.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  273.         else
  274.         {
  275.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  276.         }
  277.     }
  278.     else
  279.     {
  280.         if( intDriver->DriverSettings.Interpolation)
  281.         {
  282.             long    RightWeight, LeftWeight;
  283.         
  284.             while( i-- > 0)
  285.             {
  286.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  287.                 
  288.                 off = (aCC>>BYTEDIV);
  289.                 tByte = ((         LeftWeight **(SndBuffer + off)
  290.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  291.                 
  292.                 *ASCBuffer += (tByte * chnVol) / vol;     aCC += aDD;
  293.                 ASCBuffer += 2;
  294.             }
  295.         }
  296.         else
  297.         {
  298.             while( i-- > 0)
  299.             {
  300.                 off = (aCC>>BYTEDIV);
  301.                 *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol;     aCC += aDD;
  302.                 ASCBuffer += 2;
  303.             }
  304.         }
  305.         curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  306.     }
  307.  
  308.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  309. }
  310.  
  311.  
  312. void Sample16BufferAdd( Channel *curVoice, register short    *ASCBuffer, MADDriverRec* intDriver)
  313. {
  314.     if( curVoice->amp == 16) Sampler16Addin16( curVoice, ASCBuffer, intDriver);
  315.     else Sampler16Add( curVoice, ASCBuffer, intDriver);
  316. }
  317.  
  318. void Play16Stereo( MADDriverRec* intDriver)
  319. {
  320. short    i;
  321. short    *ttt = (short*) intDriver->IntDataPtr;
  322.  
  323.     i = intDriver->ASCBUFFER*2;
  324.     while( i != 0) ttt[ --i] = 0;
  325.     
  326.     for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
  327.     {
  328.         Sample16BufferAdd( &intDriver->chan[ i], (short*) intDriver->IntDataPtr, intDriver);
  329.         i++;
  330.         Sample16BufferAdd( &intDriver->chan[ i], (short*) (intDriver->IntDataPtr) + 1, intDriver);
  331.     }
  332. }
  333.  
  334. void Sampler16AddPoly( Channel *curVoice, register short    *ASCBuffer, short chanNo, MADDriverRec* intDriver)
  335. {
  336.     Ptr                    SndBuffer;
  337.     short                *VolPtr, i = intDriver->ASCBUFFER;
  338.     Byte                tByte;
  339.     
  340.     ///
  341.     long                off, aDD, aCC = curVoice->lAC;
  342.     
  343.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  344.     ///
  345.  
  346.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  347.  
  348.     SndBuffer        = curVoice->curPtr;
  349.     VolPtr            = (short*) ( intDriver->Vol + (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) <<8)*2L);
  350.  
  351.     if( SndBuffer  + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
  352.     {
  353.         if( intDriver->DriverSettings.Interpolation)
  354.         {
  355.             long    RightWeight, LeftWeight;
  356.         
  357.             while( i-- > 0)
  358.             {
  359.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  360.                 
  361.                 off = (aCC>>BYTEDIV);
  362.                 if( SndBuffer + off + 1 >= curVoice->maxPtr)
  363.                 {
  364.                     if( curVoice->loopSize > 0) 
  365.                     {
  366.                         SndBuffer -= curVoice->loopSize;
  367.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  368.                     }
  369.                     else break;
  370.                 }
  371.                 
  372.                 tByte = ((         LeftWeight **(SndBuffer + off)
  373.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  374.                 
  375.                 *(ASCBuffer) += *(VolPtr + tByte );     aCC += aDD;
  376.                 ASCBuffer     += chanNo;
  377.             }
  378.         }
  379.         else
  380.         {
  381.             while( i-- > 0)
  382.             {
  383.                 off = (aCC>>BYTEDIV);
  384.                 if( SndBuffer + off + 1 >= curVoice->maxPtr)
  385.                 {
  386.                     if( curVoice->loopSize > 0) 
  387.                     {
  388.                         SndBuffer -= curVoice->loopSize;
  389.                         if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
  390.                     }
  391.                     else break;
  392.                 }
  393.                 *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));     aCC += aDD;
  394.                 ASCBuffer += chanNo;
  395.             }
  396.         }
  397.         
  398.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  399.         else
  400.         {
  401.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  402.         }
  403.     }
  404.     else
  405.     {
  406.         if( intDriver->DriverSettings.Interpolation)
  407.         {
  408.             long    RightWeight, LeftWeight;
  409.             
  410.             while( i-- > 0)
  411.             {
  412.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  413.                 
  414.                 off = (aCC>>BYTEDIV);
  415.                 tByte = ((         LeftWeight **(SndBuffer + off)
  416.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  417.                 
  418.                 *(ASCBuffer) += *(VolPtr + tByte );     aCC += aDD;
  419.                 ASCBuffer     += chanNo;
  420.             }
  421.         }
  422.         else
  423.         {
  424.             while( i-- > 0)
  425.             {
  426.                 off = (aCC>>BYTEDIV);
  427.                 *(ASCBuffer) += *(VolPtr + ((Byte)*(SndBuffer + (long) (aCC>>BYTEDIV))));     aCC += aDD;
  428.                 ASCBuffer += chanNo;
  429.             }
  430.         }
  431.         
  432.         curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  433.     }
  434.  
  435.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  436. }
  437.  
  438. void Sampler16Addin16Poly( Channel *curVoice, register short    *ASCBuffer, short chanNo, MADDriverRec* intDriver)
  439. {
  440.     short                i = intDriver->ASCBUFFER, vol, tByte;
  441.     short                *SndBuffer;
  442.     long                chnVol, off;
  443.  
  444.     ///
  445.     long                aDD, aCC = curVoice->lAC;
  446.     
  447.     aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
  448.     ///
  449.  
  450.     if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
  451.     
  452.     SndBuffer        = (short*)    curVoice->curPtr;
  453.     vol                = (short)    64 * intDriver->trackDiv;    // * 2;    //intDriver->trackDiv;
  454.     chnVol            = ((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64);
  455.  
  456.     if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= ( short*) curVoice->maxPtr)
  457.     {
  458.         if( intDriver->DriverSettings.Interpolation)
  459.         {
  460.             long    RightWeight, LeftWeight;
  461.         
  462.             while( i-- > 0)
  463.             {
  464.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  465.                 
  466.                 off = (aCC>>BYTEDIV);
  467.                 if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
  468.                 {
  469.                     if( curVoice->loopSize > 0) 
  470.                     {
  471.                         SndBuffer -= curVoice->loopSize/2;
  472.                         if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
  473.                     }
  474.                     else break;
  475.                 }
  476.                 
  477.                 tByte = ((         LeftWeight **(SndBuffer + off)
  478.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  479.                 
  480.                 *ASCBuffer += (tByte * chnVol) / vol;     aCC += aDD;
  481.                 ASCBuffer += chanNo;
  482.             }
  483.         }
  484.         else
  485.         {
  486.             while( i-- > 0)
  487.             {
  488.                 off = (aCC>>BYTEDIV);
  489.                 if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
  490.                 {
  491.                     if( curVoice->loopSize > 0) 
  492.                     {
  493.                         SndBuffer -= curVoice->loopSize;
  494.                         if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
  495.                     }
  496.                     else break;
  497.                 }
  498.                 *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol;     aCC += aDD;
  499.                 ASCBuffer += chanNo;
  500.             }
  501.         }
  502.         
  503.         if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  504.         else
  505.         {
  506.             curVoice->samplePtr    = 0L;    curVoice->curPtr    = curVoice->maxPtr;
  507.         }
  508.     }
  509.     else
  510.     {
  511.         if( intDriver->DriverSettings.Interpolation)
  512.         {
  513.             long    RightWeight, LeftWeight;
  514.         
  515.             while( i-- > 0)
  516.             {
  517.                 RightWeight = aCC & ((1 << BYTEDIV) - 1);        LeftWeight = (1 << BYTEDIV) - RightWeight;
  518.                 
  519.                 off = (aCC>>BYTEDIV);
  520.                 tByte = ((         LeftWeight **(SndBuffer + off)
  521.                             +    RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
  522.                 
  523.                 *ASCBuffer += (tByte * chnVol) / vol;     aCC += aDD;
  524.                 ASCBuffer += chanNo;
  525.             }
  526.         }
  527.         else
  528.         {
  529.             while( i-- > 0)
  530.             {
  531.                 off = (aCC>>BYTEDIV);
  532.                 *ASCBuffer += (*(SndBuffer + off) * chnVol) / vol;     aCC += aDD;
  533.                 ASCBuffer += chanNo;
  534.             }
  535.         }
  536.         curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
  537.     }
  538.  
  539.     curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
  540. }
  541.  
  542. void Sample16BufferAddPoly( Channel *curVoice, register short    *ASCBuffer, short chanNo, MADDriverRec* intDriver)
  543. {
  544.     if( curVoice->amp == 16) Sampler16Addin16Poly( curVoice, ASCBuffer, chanNo, intDriver);
  545.     else Sampler16AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
  546. }
  547.  
  548. void Play16PolyPhonic( MADDriverRec* intDriver)
  549. {
  550. long    i, x;
  551. short    *aLPtr = (short*) intDriver->IntDataPtr;
  552.  
  553.     x = intDriver->DriverSettings.numChn * intDriver->ASCBUFFER;
  554.     while( x-- > 0) *aLPtr++ = 0;
  555.  
  556.     for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
  557.     {
  558.         Sample16BufferAddPoly( &intDriver->chan[ i], (short*) (intDriver->IntDataPtr) + i, intDriver->DriverSettings.numChn, intDriver);
  559.     }
  560. }
  561.  
  562. void Play16Mono( MADDriverRec* intDriver)
  563. {
  564. short    i;
  565. short    *ttt = (short*) intDriver->IntDataPtr;
  566.  
  567.     i = intDriver->ASCBUFFER;
  568.     while( i-- > 0) *ttt++ = 0;
  569.  
  570.     for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
  571.     {
  572.         Sample16BufferAddPoly( &intDriver->chan[ i], (short*) intDriver->IntDataPtr, 1, intDriver);
  573.     }
  574. }